package 单周赛.history;

import java.util.*;

/**
 *
 */
public class 第317场单周赛 {

    public static void main(String[] args) {

        System.out.println(averageValue(new int[]{1, 3, 6, 10, 12, 15}));

        System.out.println(mostPopularCreator(new String[]{"alice", "bob", "alice", "chris"},
                new String[]{"one", "two", "three", "four"},
                new int[]{5, 10, 5, 4}));

        System.out.println(new 第317场单周赛().makeIntegerBeautiful(6068060761L
                , 3));
    }

    /**
     * 模拟
     * 注意 0 不能被除
     *
     * @param nums
     * @return
     */
    public static int averageValue(int[] nums) {
        int sum = 0, count = 0;
        for (int num : nums) {
            if (num % 2 == 0 && num % 3 == 0) {
                sum += num;
                count++;
            }
        }
        return count == 0 ? 0 : sum / count;
    }

    /**
     * 哈希表
     *
     * @param creators
     * @param ids
     * @param views
     * @return
     */
    public static List<List<String>> mostPopularCreator(String[] creators, String[] ids, int[] views) {
        List<List<String>> lists = new ArrayList<>();
        Map<String, String[]> mapMaxView = new HashMap<>();
        Map<String, Integer> mapSumView = new HashMap<>();

        for (int i = 0; i < creators.length; i++) {
            if (mapMaxView.containsKey(creators[i])) {
                String[] maxIdAndView = mapMaxView.get(creators[i]);
                if (Integer.valueOf(maxIdAndView[1]) < views[i]) {
                    maxIdAndView[0] = ids[i];
                    maxIdAndView[1] = String.valueOf(views[i]);
                } else if (Integer.valueOf(maxIdAndView[1]) == views[i] &&
                        maxIdAndView[0].compareTo(ids[i]) > 0) {
                    // 注意: 当播放量一样时，找出字典序最小的 id
                    maxIdAndView[0] = ids[i];
                }
            } else {
                mapMaxView.put(creators[i], new String[]{ids[i], String.valueOf(views[i])});
            }

            mapSumView.put(creators[i],
                    mapSumView.getOrDefault(creators[i], 0) + views[i]);
        }

        String[][] sortArr = new String[mapSumView.size()][2];
        int idx = 0;
        for (Map.Entry<String, Integer> entry : mapSumView.entrySet()) {
            sortArr[idx] = new String[]{entry.getKey(), String.valueOf(entry.getValue())};
            idx++;
        }
        Arrays.sort(sortArr, (a, b) -> Integer.valueOf(b[1]) -
                Integer.valueOf(a[1]));
        int maxSum = Integer.valueOf(sortArr[0][1]);
        for (String[] strings : sortArr) {
            if (Integer.valueOf(strings[1]) >= maxSum) {
                List<String> list = new ArrayList<>();
                list.add(strings[0]);
                list.add(mapMaxView.get(strings[0])[0]);
                lists.add(list);
            } else {
                break;
            }
        }

        return lists;
    }

    /**
     * 贪心
     * 从个位开始，加上一个个位数，使得 n 的个位数变成 0，
     * 比如，463，个位数是 3 ，如果想要使得数位之和变小，
     * 那么 3 的位置可以是 0,1,2 ,分别需要加上的 x 是
     * 7,8,9，题目要求 x 尽可能的小，需要加上的 x 是 10-7
     * 如果不能满足条件，n -> 470 ，百位数是 7，需要
     * 加上的 x 是 100-70
     * ...
     */
    public long makeIntegerBeautiful(long n, int target) {
        long x = 0;
        int bit = 0;

        char[] bits = new StringBuilder().append(n)
                .reverse().toString().toCharArray();

        while (bitSum(n) > target) {
            // 获取某个位的数字是多少，不能使用 %10，会存在 100 的情况
            int a = bits[bit] - '0';
            if (a == 0) {
                bit++;
                continue;
            }

            long curX = (long) Math.pow(10, (bit + 1)) - a * (long) Math.pow(10, bit);
            bit++;
            x += curX;
            n += curX;
            bits = new StringBuilder().append(n)
                    .reverse().toString().toCharArray();
        }

        return x;
    }

    private int bitSum(long n) {
        int sum = 0;
        while (n > 0) {
            sum += n % 10;
            n /= 10;
        }
        return sum;
    }

}
